package entite;

import java.io.Serializable;
import java.util.List;
import javax.faces.model.SelectItem;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;

/**
 *
 * Permet de créer des questions
 */
@Entity
@Table(name = "question", catalog = "feedbackform", schema = "")
@NamedQueries({    
    @NamedQuery(name = "Question.findLibelleQuestion", query = "SELECT q FROM Question q WHERE q.libelle LIKE :libelleQuestion")})
public class Question implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Integer id;
    @Basic(optional = false)
    @Lob
    @Column(name = "libelle", nullable = false, length = 65535)
    private String libelle;
    @Column(name = "tempsLimiteQuestion")
    private Integer tempsLimiteQuestion;
    @Column(name = "nbChoixPossible")
    private Integer nbChoixPossible;
    @OneToMany(cascade = CascadeType.ALL, mappedBy="question")
    @OrderBy(value="ordre")
    private List<Reponse> reponseCollection;
    @Column(name = "TypeRendu_id")
    @Enumerated(EnumType.STRING)
    private RenduEnum typeRendu;

    /**
     * Constructeur
     */
    public Question() {
    }

    /**
     * Constructeur
     * @param id
     */
    public Question(Integer id) {
        this.id = id;
    }

    /**
     * Constructeur
     * @param id
     * @param libelle
     */
    public Question(Integer id, String libelle) {
        this.id = id;
        this.libelle = libelle;
    }

    /**
     * Renvoie l'id en base de la question
     * @return
     */
    public Integer getId() {
        return id;
    }

    /**
     * Id gérer automatiquement
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Renvoie le titre de la réponse
     * @return
     */
    public String getLibelle() {
        return libelle;
    }

    /**
     * Change le titre de la question
     * @param libelle
     */
    public void setLibelle(String libelle) {
        this.libelle = libelle;
    }

    /**
     * renvoir la durée qui est accordé à l'utilisateur pour répondre à la question.
     * si <=0 alors le temps est ilimité
     * @return
     */
    public Integer getTempsLimiteQuestion() {
        return tempsLimiteQuestion;
    }

    /**
     * Si c'est <=0 l'utilisateur n'est pas limite par le temps pour répondre à la question
     * @param tempsLimiteQuestion
     */
    public void setTempsLimiteQuestion(Integer tempsLimiteQuestion) {
        this.tempsLimiteQuestion = tempsLimiteQuestion;
    }

    /**
     * renvoie le nombre max de réponse que peut choisir l'utilisateur
     * @return
     */
    public Integer getNbChoixPossible() {
        return nbChoixPossible;
    }

    /**
     * met à jour le nombre max de réponse que peut choisir l'utilisateur
     * @param nbChoixPossible
     */
    public void setNbChoixPossible(Integer nbChoixPossible) {
        this.nbChoixPossible = nbChoixPossible;
    }

//    public Collection<Reponse> getReponseCollection() {
    /**
     * Renvoie une liste de réponse de la question
     * @return
     */
    public List<Reponse> getReponseCollection() {
        return reponseCollection;
    }

//    public void setReponseCollection(Collection<Reponse> reponseCollection) {
    /**
     * Met à jour la liste de réponse de la question
     * @param reponseCollection
     */
    public void setReponseCollection(List<Reponse> reponseCollection) {
        this.reponseCollection = reponseCollection;
    }

    /**
     * Renvoie le type de la question (LISTBOX,RADIO_BUTTON,TEXTAREA,CHECKBOX)
     * @return
     */
    public RenduEnum getTypeRendu() {
        return typeRendu;
    }

    /**
     * Met à jour le type de la question (LISTBOX,RADIO_BUTTON,TEXTAREA,CHECKBOX)
     * @param typeRendu
     */
    public void setTypeRendu(RenduEnum typeRendu) {
        this.typeRendu = typeRendu;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Question)) {
            return false;
        }
        Question other = (Question) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entite.Question[id=" + id + "]";
    }

    /**
     * renvoie un tableau de réponse lié à cette question
     * @return
     */
    public SelectItem[] getReponseItems(){
        SelectItem[] tabReponse = new SelectItem[reponseCollection.size()];
        for (int i = 0; i < reponseCollection.size(); i++) {
            tabReponse[i] = new SelectItem(reponseCollection.get(i).getId(), reponseCollection.get(i).getLibelle());
        }
        return tabReponse;
    }

}
